package david.java.practice.algorithm.leetcode;

/**
 * @Description: 搜索旋转排序数组 https://leetcode.cn/problems/search-in-rotated-sorted-array/
 * <p>
 * 整数数组 nums 按升序排列，数组中的值 互不相同 。
 * <p>
 * 在传递给函数之前，nums 在预先未知的某个下标 k（0 <= k < nums.length）上进行了 旋转，使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]（下标 从 0 开始 计数）。例如， [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为[4,5,6,7,0,1,2] 。
 * <p>
 * 给你 旋转后 的数组 nums 和一个整数 target ，如果 nums 中存在这个目标值 target ，则返回它的下标，否则返回-1。
 * 示例 1：
 * <p>
 * 输入：nums = [4,5,6,7,0,1,2], target = 0
 * 输出：4
 * 示例2：
 * <p>
 * 输入：nums = [4,5,6,7,0,1,2], target = 3
 * 输出：-1
 * 示例 3：
 * <p>
 * 输入：nums = [1], target = 0
 * 输出：-1
 * @Author: ZhaoDawei
 * @Date: Create in 10:18 上午 2022/4/29
 */
public class LC_0033_searchRotateArrayIndex {


    /**
     * 功能描述:  log(n)时间复杂度 肯定是二分法
     * <p>
     * 下面数据是从 4的地方开始旋转,  这样从mid分开,会成为两个数组, 而且肯定一个是有序的,一个是非有序的, 我们先判断 target是否在有序的数组里面, 如果在,那就二分法, 如果不在的话,
     * 我们切割乱序的部分, 同样分成一个有序的数组,一个无序的数组, 一次类推
     * 除了要比较中间值的大小 ,还要比较每段的两端, 以此判断target在 旋转区域还是正常的区域
     * <p>
     * 3, 4, 5, 6, 7, 1, 2
     *
     *
     * 6, 7, 1, 2, 3, 4, 5
     *
     * @param nums
     * @return:
     */
    public static int findRotateIndex(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int l = 0, r = nums.length - 1;

        while (l <= r) {
            int mid = (l + r) / 2;
            if (target == nums[mid]) {
                return mid;
            }
            // 左边有序
            if (nums[l] < nums[mid]) {
                if (nums[l] == target) {
                    return l;
                }
                if (nums[l] < target && target < nums[mid]) {
                        r = mid -1;
                } else {
                    l = mid + 1;
                }
            } else {
                if (nums[r] == target) {
                    return r;
                }
                if (nums[mid] < target && target < nums[r]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }

        return -1;
    }

    public static void main(String[] args) {
        int[] ints = {6, 7, 1, 2, 3, 4, 5};
        // int[] ints = {3, 4, 5, 6, 7, 1, 2};
        int rotateIndex = findRotateIndex(ints, 4);
        System.out.println(rotateIndex);
    }
}
